package com.hbnu.controller;
import com.hbnu.pojo.User;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

@Controller
public class ZuoyeServelet {
    @InitBinder
//    给Binder做初始化的，主要用在@Controller中，初始化当前控制器的数据绑定
    private void initBinder(WebDataBinder binder){
//        WebDataBinder从Request中取出亲求参数并绑定到JavaBean中
        DateFormat df =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        CustomDateEditor dateEditor=new CustomDateEditor(df,true);
        binder.registerCustomEditor(Date.class,dateEditor);
//        用于注册，属性编译器
    }
    @RequestMapping("/hello")
//   发送一个GET请求到/hello URL时，就会调用hello()方法
    @ResponseBody
//    @RequestMapping()用来处理请求地址映射的注解，用于映射一个请求或者方法，用在类或者方法上
    public String hello(){
        return "hello fanglongru";
    }

    @RequestMapping(value = "/user/{id:?.?.?.?.?}", method = RequestMethod.GET)
//    占位符 ? 可以用于匹配URL路径中的单个字符
//    method = RequestMethod.GET 指定了只接受 GET 请求。如果想接受其他类型的请求，可以改变这个值，或者完全省略这个属性以接受所有类型的请求。
    public String getUserById(
            @PathVariable String id) {
        return "User ID: " + id;
    }

    @RequestMapping(value = "/files/**")
//    星号 * 可以用于匹配 URL 路径中的多个字符，直到遇到下一个路径分隔符（通常是 /)
    public String getAllFiles() {
        return "Files";
    }

    @RequestMapping(value = "/users/{id:\\d+}")
//    {id:\\d+} 是一个正则表达式，要求 id 路径变量由一个或多个数字组成。
    public String getUserByIdRegex(
            @PathVariable String id) {
        return "User ID: " + id;
    }

    @GetMapping("/users/{id}")
    @ResponseBody
    public String getUserById2(
            @PathVariable("id") String userId) {
        // 在这里，userId 将会从 URL 中的 {id} 部分获取
        return "User ID: " + userId;
    }
    @RequestMapping("/param1/{username}/{address}")
    @ResponseBody
    public void param1(
            @PathVariable String username,
            @PathVariable String address){
//        @PathVariable 是 Spring MVC 中的一个注解，用于从 URL 模板变量中绑定请求参数到方法参数上。
//        当在 URL 中使用占位符（例如 {id}）时，Spring MVC 会自动将这些占位符的值绑定到使用 @PathVariable 注解的方法参数上。
        System.out.println(username);
        System.out.println(address);
    }

    @GetMapping("/param2")
    @ResponseBody
    public String param2(
            @RequestParam String name) {
//        @RequestParam 是 Spring MVC 中的一个注解，用于将请求参数绑定到控制器方法的参数上。
//         这个注解通常用于处理查询参数（即 URL 中 ? 后面的参数），或者表单数据。
        // name 参数将会从请求参数中获取
        return "Hello, " + name + "!";
    }
    @RequestMapping("/param3")
    @ResponseBody
    public void param3(
            @RequestParam String param1){
        System.out.println(param1);
//        上课讲的
    }

    @GetMapping("/show-header")
    @ResponseBody
    public String showHeader(
            @RequestHeader("User-Agent") String userAgent) {
// 用于将 HTTP 请求头中的信息绑定到控制器方法的参数上。处理 HTTP 请求可能需要访问请求头中的一些信息，
        // userAgent 参数将会从请求头中的 User-Agent 字段获取
        System.out.println(userAgent);
        return "User-Agent: " + userAgent;
    }

//    重定向
//    通过服务器指示客户端浏览器转到另一个地址
    @RequestMapping("/redirect")
    public String redirect(Model model){
        model.addAttribute("username","fanglongru");
        return "redirect:/redirect.jsp";
    }

    @RequestMapping("/forward")
//    告诉Spring MVC当有一个HTTP请求的路径为/forward时，应该调用下面的forward方法。
    public String forward(Model model){
//        Model是Spring MVC中用于在控制器和视图之间传递数据的接口。
        model.addAttribute("username","fanglongru");
        return "forward:/forward.jsp";
    }

    @RequestMapping("demo1")
    @ResponseBody
    public String demo1(){
        return "这是一个中文信息";
//        在springweb.xml中配置字符编码过滤器，将其映射到所有的URL上。
    }

//    Model 数据存储
    @GetMapping("/displayMessage")
    public String displayMessage(Model model) {
//        displayMessage方法接收一个Model对象作为参数
        // 将数据添加到Model中
        String message = "Hello, Spring MVC!";
        model.addAttribute("message", message);
        // 返回视图的名称
        return "myView";
    }

    @ModelAttribute("user")
    public User UserModel(
            @RequestParam String name) {
        User user = new User();
        user.setUsername(name);
        return user;
    }
    //静态资源访问:springweb.xml


}
